home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / tetujin / src / g_eff / yuvcnv.c < prev   
Text File  |  1994-11-16  |  4KB  |  179 lines

  1. /*
  2.         graphic effect lib.
  3.           YUV変換→階調可変→RGB変換
  4.  
  5.         h. Toda 1994 5 16
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <egb.h>
  11. #include "g_eff.h"
  12.  
  13. #define NOERR 0        /* no error */
  14. #define TOTAL 1024
  15.  
  16. static int mx ;
  17. static int aSen ;
  18. static int mSen ;
  19. static int cMax ;
  20. static int aMax ;
  21. static int x1 ;
  22. static int y1 ;
  23. static int x2 ;
  24. static int y2 ;
  25. static int (*read1)() ;
  26. static int (*write)() ;
  27. static int (*mask)() ;
  28.  
  29. g_yuvConv( BASICPARA *para, int ydiv, int udiv, int vdiv, int mode )
  30. {
  31.     mx = para->mix ;
  32.     aSen = para->alphaSen ;
  33.     mSen = para->maskSen ;
  34.     cMax = para->colorMax ;
  35.     aMax = para->alphaMax ;
  36.     x1 = para->lupx ;
  37.     y1 = para->lupy ;
  38.     x2 = para->rdwx ;
  39.     y2 = para->rdwy ;
  40.     read1 = para->read1 ;
  41.     write = para->write ;
  42.     mask = para->mask ;
  43.  
  44.     int x, y ;
  45.  
  46.     if( (ydiv == 0) || (udiv == 0) || (vdiv == 0) )
  47.         return 0 ;
  48.  
  49.     for( y=y1 ; y<=y2 ; y++ )
  50.     {
  51.         for( x=x1 ; x<=x2 ; x++ )
  52.         {
  53.             char a[4], b[4] ;
  54.             int y0, u0, v0, r0, g0, b0 ;
  55.  
  56.             read1( x, y, a ) ;
  57.  
  58.             rgbToYuv( a[0], a[1], a[2], &y0, &u0, &v0, cMax ) ;
  59.  
  60.             if( mode )
  61.             {
  62.                 int temp ;
  63.  
  64.                 if( mode == 1 )
  65.                 {
  66.                     read1( (x/2)*2, y, b ) ;
  67.                     rgbToYuv( b[0], b[1], b[2], &temp, &u0, &v0, cMax ) ;
  68.                 }
  69.                 if( mode == 2 )
  70.                 {
  71.                     read1( x, (y/2)*2, b ) ;
  72.                     rgbToYuv( b[0], b[1], b[2], &temp, &u0, &v0, cMax ) ;
  73.                 }
  74.                 if( mode == 3 )
  75.                 {
  76.                     read1( (x/2)*2, (y/2)*2, b ) ;
  77.                     rgbToYuv( b[0], b[1], b[2], &temp, &u0, &v0, cMax ) ;
  78.                 }
  79.             }
  80.  
  81.             y0 = y0 * ydiv / 256 ;
  82.             y0 = y0 * 256 / ydiv + (128 / ydiv) ;
  83.             if( y0 > 255 )y0 = 255 ;
  84.  
  85.             u0 = u0 * udiv / 256 ;
  86.             u0 = u0 * 256 / udiv + (128 / udiv) ;
  87.             if( u0 > 255 )u0 = 255 ;
  88.  
  89.             v0 = v0 * vdiv / 256 ;
  90.             v0 = v0 * 256 / vdiv + (128 / vdiv) ;
  91.             if( v0 > 255 )v0 = 255 ;
  92.  
  93.             yuvToRgb( y0, u0, v0, &r0, &g0, &b0, cMax ) ;
  94.             b[0] = r0 ;
  95.             b[1] = g0 ;
  96.             b[2] = b0 ;
  97.  
  98.             mixWrite( x, y, b, a ) ;
  99.         }
  100.     }
  101.  
  102.     return NOERR ;
  103. }
  104.  
  105. static mixWrite( int x, int y, unsigned char *a, unsigned char *b )
  106. {
  107.     unsigned char c[4] ;
  108.     int mix ;
  109.  
  110.     if( mSen )
  111.     {
  112.         if( mask( x, y ) >= mSen )
  113.             return NOERR ;
  114.     }
  115.  
  116.     mix = mx ;
  117.     if( aSen )
  118.     {
  119.         mix = mix * b[3] / aMax ;
  120.     }
  121.  
  122.     c[0] = ( a[0] * mix + b[0] * ( 256 - mix ) + 0x80 ) >> 8 ;
  123.     c[1] = ( a[1] * mix + b[1] * ( 256 - mix ) + 0x80 ) >> 8 ;
  124.     c[2] = ( a[2] * mix + b[2] * ( 256 - mix ) + 0x80 ) >> 8 ;
  125.     c[3] = b[3] ;
  126.  
  127.     if( mix )
  128.     {
  129.         write( x, y, c ) ;
  130.     }
  131.  
  132.     return NOERR ;
  133. }
  134.  
  135.  
  136.  
  137. static rgbToYuv( int r0, int g0, int b0, int *y0, int *u0, int *v0, int max )
  138. {
  139.     int y, cb, cr ;
  140.  
  141.     y  =  19595*r0 + 38470*g0 + 7471*b0 ;
  142.     cb = -11049*r0 - 21699*g0 + 32748*b0 ;
  143.     cr =  32755*r0 -27427*g0 -5328*b0 ;
  144.  
  145.     *y0 = ( ((y/max)*219) >> 16 ) + 16 ;
  146.     *u0 = ( ((cb/max)*224) >> 16 ) + 128 ;
  147.     *v0 = ( ((cr/max)*224) >> 16 ) + 128 ;
  148.  
  149.     if( *y0 < 0 )*y0 = 0 ;
  150.     if( *y0 > 255 )*y0 = 255 ;
  151.     if( *u0 < 0 )*u0 = 0 ;
  152.     if( *u0 > 255 )*u0 = 255 ;
  153.     if( *v0 < 0 )*v0 = 0 ;
  154.     if( *v0 > 255 )*v0 = 255 ;
  155.  
  156.     return NOERR ;
  157. }
  158.  
  159. static yuvToRgb( int y0, int u0, int v0, int *r0, int *g0, int *b0, int max )
  160. {
  161.     y0 = (( y0 - 16 ) * max )/219 ;
  162.     u0 = (( u0 -128 ) * max )/224 ;
  163.     v0 = (( v0 -128 ) * max )/224 ;
  164.  
  165.     *r0 = ( 65536*y0 + 4*u0 + 91920*v0 ) >> 16 ;
  166.     *g0 = ( 65536*y0 - 22569*u0 - 46819*v0 ) >> 16 ;
  167.     *b0 = ( 65536*y0 + 116198*u0 - 9*v0 ) >> 16 ;
  168.  
  169.     if( *r0 < 0 )*r0 = 0 ;
  170.     if( *r0 > max )*r0 = max ;
  171.     if( *g0 < 0 )*g0 = 0 ;
  172.     if( *g0 > max )*g0 = max ;
  173.     if( *b0 < 0 )*b0 = 0 ;
  174.     if( *b0 > max )*b0 = max ;
  175.  
  176.     return NOERR ;
  177. }
  178.  
  179.